package com.lmq.innerclasses;// innerclasses/Parcel7.java
// (c)2021 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// Returning an instance of an anonymous inner class

public class Parcel7 {
  public Contents contents() {
    return new Contents() { // Insert class definition
      private int i = 11;
      @Override public int value() { return i; }
    }; // Semicolon required
  }
  public static void main(String[] args) {
    Parcel7 p = new Parcel7();
    Contents c = p.contents();
  }
}
/**
 * The contents() method combines the creation of the return value with the definition of the
 * class that represents the return value. In addition, the class has no name-it's anonymous.It looks as if
 * you're creating a Contents object, But then, before you get to the semicolon, you
 * say, "But wait, I think I'll slip in a class definition."
 * What this strange syntax means is "Create an object of an anonymous class that's inherited from Contents."
 * The reference return by the new expression is automatically upcast to
 * a Contents reference. The anonymous inner-class syntax is shorthand for:
 *
 */
/**
 * {{{
 *     public class Parce17b {
 *         class MyContents implements Contents {
 *             private int i = 11;
 *            @Override public int value() { return i; }
 *             }
 *            public Contents contents() {
 *              return new MyContents();
 *
 *            }
 *         public static void main(String[] args) {
 *             Parce17b p = new Parce17b();
 *             Contents c = p.contents();
 *         }
 *     }
 * }}}
 */
